package com.aididi.collection;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @Auther: xuzexiang
 * @Date: 2018-10-30 0030 10:40
 * @Description:
 */
public class LinkedListDemo {
    public static void main(String[] args) {
        List list = new ArrayList(10);
        list.add("a");
        list.add("b");
        list.add("d");
        list.add("c");
        list.add("e");
        list.add("f");
        list.add("g");
        list.add("h");
        list.add("i");
        list.add("j");
        list.add("k");
        list.forEach(System.out::println);

        //线程安全的list
        CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList();
        copyOnWriteArrayList.add(1);

        //LinkedList是一个双向链表结构的list
        LinkedList<Hero> ll = new LinkedList<>();
        //所以可以很方便的在头部和尾部插入数据
        //在最后插入新的英雄
        ll.addLast(new Hero("hero1"));
        ll.addLast(new Hero("hero2"));
        ll.addLast(new Hero("hero3"));
        System.out.println(ll);
        System.out.println(ll.remove());
        System.out.println(ll);
        //在最前面插入新的英雄
        ll.addFirst(new Hero("heroX"));
        System.out.println(ll);

        //查看最前面的英雄
        System.out.println(ll.getFirst());
        //查看最后面的英雄
        System.out.println(ll.getLast());

        //查看不会导致英雄被删除
        System.out.println(ll);
        //取出最前面的英雄
        System.out.println(ll.removeFirst());

        //取出最后面的英雄
        System.out.println(ll.removeLast());

        //查看会导致英雄被删除
        System.out.println(ll);


        //所不同的是LinkedList还实现了Deque，进而又实现了Queue这个接口
        //Queue代表FIFO 先进先出的队列
        Queue<Hero> q= new LinkedList<>();

        //加在队列的最后面
        System.out.print("初始化队列：\t\n");
        q.offer(new Hero("Hero1"));
        q.offer(new Hero("Hero2"));
        q.offer(new Hero("Hero3"));
        q.offer(new Hero("Hero4"));

        System.out.println(q);
        System.out.print("把第一个元素取poll()出来:\t");
        //取出第一个Hero，FIFO 先进先出
        Hero h = q.poll();
        System.out.println(h);
        System.out.print("取出第一个元素之后的队列:\t");
        System.out.println(q);

        //把第一个拿出来看一看，但是不取出来
        h=q.peek();
        System.out.print("查看peek()第一个元素:\t");
        System.out.println(h);
        System.out.print("查看并不会导致第一个元素被取出来:\t");
        System.out.println(q);


        //10进制转化其他进制	对应的方法,参数:n(原10进制数据),r(进制),	返回值
        //10进制转2进制	Integer.toBinaryString(n);	一个二进制字符串.
        //10进制转8进制	Integer.toOctalString(n);	一个八进制字符串
        //10进制转16进制	Integer.toHexString(n);	一个16进制字符串
        //10进制转 r 进制	Integer.toString(100, 16);	一个r进制字符串
        //r进制转10进制	方法
        //radix进制的字符串s转10进制	Integer.parseInt((String) s,(int) radix)


        System.out.println("正数二进制："+Integer.toBinaryString(20));
        System.out.println("负数二进制："+Integer.toBinaryString(-20));
        System.out.println(1%2);
        System.out.println((1/2));
        //：x<<y 相当于 x*2y ；x>>y相当于x/2y

        int n = 8 - 1;
        n |= n >>> 1;
        System.out.println("n:"+n);

        System.out.println(1 << 3);
        System.out.println(2 << 2);
        System.out.println(2 >> 2);
    }
}


class Hero{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Hero(String name) {
        this.name = name;
    }

    public Hero() {
    }

    @Override
    public String toString() {
        return "Hero{" +
                "name='" + name + '\'' +
                '}';
    }
}
